/**
 * enhancer就是applyMiddleware(...middlewares)的返回结果
 */

export const createStore = (reducer, enhancer) => {

  if (enhancer) {
    return enhancer(createStore)(reducer);
  }

  let currentState = {};
  let listeners = new Map();
  let listenerCounter = 0;

  // 获取状态
  function getState() { 
    return currentState;
  }
  // 根据不同的操作，修改不同的状态，然后通知监听者状态变更了 最后返回action
  function dispatch(action) { 
    currentState = reducer(currentState, action);

    listeners.forEach(cb => cb());

    return action;
  }
  // 观察者模式实现监听状态变化  最后返回一个解除监听的方法
  function subscribe(listenerCb) { 
    const listenerId = listenerCounter++;
    listeners.set(listenerId, listenerCb);

    return function unsubscribe() {
      listeners.delete(listenerId);
    }
  }

  // 调用dispatch进行状态初始化
  dispatch({ type: '@@REDUX__INIT' });

  // 把创建的store的方法向外暴露
  return { getState, dispatch, subscribe };
}